home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / idlelib / ParenMatch.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  7KB  |  176 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''ParenMatch -- An IDLE extension for parenthesis matching.
  5.  
  6. When you hit a right paren, the cursor should move briefly to the left
  7. paren.  Paren here is used generically; the matching applies to
  8. parentheses, square brackets, and curly braces.
  9. '''
  10. from HyperParser import HyperParser
  11. from configHandler import idleConf
  12. _openers = {
  13.     ')': '(',
  14.     ']': '[',
  15.     '}': '{' }
  16. CHECK_DELAY = 100
  17.  
  18. class ParenMatch:
  19.     """Highlight matching parentheses
  20.  
  21.     There are three supported style of paren matching, based loosely
  22.     on the Emacs options.  The style is select based on the
  23.     HILITE_STYLE attribute; it can be changed used the set_style
  24.     method.
  25.  
  26.     The supported styles are:
  27.  
  28.     default -- When a right paren is typed, highlight the matching
  29.         left paren for 1/2 sec.
  30.  
  31.     expression -- When a right paren is typed, highlight the entire
  32.         expression from the left paren to the right paren.
  33.  
  34.     TODO:
  35.         - extend IDLE with configuration dialog to change options
  36.         - implement rest of Emacs highlight styles (see below)
  37.         - print mismatch warning in IDLE status window
  38.  
  39.     Note: In Emacs, there are several styles of highlight where the
  40.     matching paren is highlighted whenever the cursor is immediately
  41.     to the right of a right paren.  I don't know how to do that in Tk,
  42.     so I haven't bothered.
  43.     """
  44.     menudefs = [
  45.         ('edit', [
  46.             ('Show surrounding parens', '<<flash-paren>>')])]
  47.     STYLE = idleConf.GetOption('extensions', 'ParenMatch', 'style', default = 'expression')
  48.     FLASH_DELAY = idleConf.GetOption('extensions', 'ParenMatch', 'flash-delay', type = 'int', default = 500)
  49.     HILITE_CONFIG = idleConf.GetHighlight(idleConf.CurrentTheme(), 'hilite')
  50.     BELL = idleConf.GetOption('extensions', 'ParenMatch', 'bell', type = 'bool', default = 1)
  51.     RESTORE_VIRTUAL_EVENT_NAME = '<<parenmatch-check-restore>>'
  52.     RESTORE_SEQUENCES = ('<KeyPress>', '<ButtonPress>', '<Key-Return>', '<Key-BackSpace>')
  53.     
  54.     def __init__(self, editwin):
  55.         self.editwin = editwin
  56.         self.text = editwin.text
  57.         editwin.text.bind(self.RESTORE_VIRTUAL_EVENT_NAME, self.restore_event)
  58.         self.counter = 0
  59.         self.is_restore_active = 0
  60.         self.set_style(self.STYLE)
  61.  
  62.     
  63.     def activate_restore(self):
  64.         if not self.is_restore_active:
  65.             for seq in self.RESTORE_SEQUENCES:
  66.                 self.text.event_add(self.RESTORE_VIRTUAL_EVENT_NAME, seq)
  67.             
  68.             self.is_restore_active = True
  69.         
  70.  
  71.     
  72.     def deactivate_restore(self):
  73.         if self.is_restore_active:
  74.             for seq in self.RESTORE_SEQUENCES:
  75.                 self.text.event_delete(self.RESTORE_VIRTUAL_EVENT_NAME, seq)
  76.             
  77.             self.is_restore_active = False
  78.         
  79.  
  80.     
  81.     def set_style(self, style):
  82.         self.STYLE = style
  83.         if style == 'default':
  84.             self.create_tag = self.create_tag_default
  85.             self.set_timeout = self.set_timeout_last
  86.         elif style == 'expression':
  87.             self.create_tag = self.create_tag_expression
  88.             self.set_timeout = self.set_timeout_none
  89.         
  90.  
  91.     
  92.     def flash_paren_event(self, event):
  93.         indices = HyperParser(self.editwin, 'insert').get_surrounding_brackets()
  94.         if indices is None:
  95.             self.warn_mismatched()
  96.             return None
  97.         
  98.         self.activate_restore()
  99.         self.create_tag(indices)
  100.         self.set_timeout_last()
  101.  
  102.     
  103.     def paren_closed_event(self, event):
  104.         closer = self.text.get('insert-1c')
  105.         if closer not in _openers:
  106.             return None
  107.         
  108.         hp = HyperParser(self.editwin, 'insert-1c')
  109.         if not hp.is_in_code():
  110.             return None
  111.         
  112.         indices = hp.get_surrounding_brackets(_openers[closer], True)
  113.         if indices is None:
  114.             self.warn_mismatched()
  115.             return None
  116.         
  117.         self.activate_restore()
  118.         self.create_tag(indices)
  119.         self.set_timeout()
  120.  
  121.     
  122.     def restore_event(self, event = None):
  123.         self.text.tag_delete('paren')
  124.         self.deactivate_restore()
  125.         self.counter += 1
  126.  
  127.     
  128.     def handle_restore_timer(self, timer_count):
  129.         if timer_count == self.counter:
  130.             self.restore_event()
  131.         
  132.  
  133.     
  134.     def warn_mismatched(self):
  135.         if self.BELL:
  136.             self.text.bell()
  137.         
  138.  
  139.     
  140.     def create_tag_default(self, indices):
  141.         '''Highlight the single paren that matches'''
  142.         self.text.tag_add('paren', indices[0])
  143.         self.text.tag_config('paren', self.HILITE_CONFIG)
  144.  
  145.     
  146.     def create_tag_expression(self, indices):
  147.         '''Highlight the entire expression'''
  148.         if self.text.get(indices[1]) in (')', ']', '}'):
  149.             rightindex = indices[1] + '+1c'
  150.         else:
  151.             rightindex = indices[1]
  152.         self.text.tag_add('paren', indices[0], rightindex)
  153.         self.text.tag_config('paren', self.HILITE_CONFIG)
  154.  
  155.     
  156.     def set_timeout_none(self):
  157.         '''Highlight will remain until user input turns it off
  158.         or the insert has moved'''
  159.         self.counter += 1
  160.         
  161.         def callme(callme, self = self, c = self.counter, index = self.text.index('insert')):
  162.             if index != self.text.index('insert'):
  163.                 self.handle_restore_timer(c)
  164.             else:
  165.                 self.editwin.text_frame.after(CHECK_DELAY, callme, callme)
  166.  
  167.         self.editwin.text_frame.after(CHECK_DELAY, callme, callme)
  168.  
  169.     
  170.     def set_timeout_last(self):
  171.         '''The last highlight created will be removed after .5 sec'''
  172.         self.counter += 1
  173.         self.editwin.text_frame.after(self.FLASH_DELAY, (lambda self = self, c = self.counter: self.handle_restore_timer(c)))
  174.  
  175.  
  176.